#include "IIC.h"
#include <stm32f10x.h>

void IIC_init() {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitTypeDef GPIOB_initial;

    GPIOB_initial.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIOB_initial.GPIO_Pin = IIC_SCL | IIC_SDA;
    GPIOB_initial.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIOB_initial);

    // spare time , high level
    GPIO_WriteBit(GPIOB, IIC_SCL, Bit_SET);
    GPIO_WriteBit(GPIOB, IIC_SDA, Bit_SET);
    // p();
}

void IIC_SCL_output_bit(int bit) {

    if (bit == 1) {
        GPIO_WriteBit(GPIOB, IIC_SCL, Bit_SET);
    } else {
        GPIO_WriteBit(GPIOB, IIC_SCL, Bit_RESET);
    }
}

void IIC_SDA_output_bit(int bit) {

    if (bit == 1) {
        GPIO_WriteBit(GPIOB, IIC_SDA, Bit_SET);
    } else {
        GPIO_WriteBit(GPIOB, IIC_SDA, Bit_RESET);
    }
}

void IIC_output_8_bit(byte b) {

    // low level first
    IIC_SCL_output_bit(0);
    // 8位
    for (int i = 7; i >= 0; i--) {
        IIC_SDA_output_bit(b >> i & 1);

        // 上升沿触发，低电平到高电平的变换才是接收数据?
        IIC_SCL_output_bit(1);
        IIC_SCL_output_bit(0);
    }
    // 第9位 ack low level in SDA
    //  finally,stop signal
    IIC_SDA_output_bit(0);
    IIC_SCL_output_bit(1);
    IIC_SCL_output_bit(0);
}

void IIC_output_data(/*byte addr,*/ byte data[], int len) {

    //p();
    // start
    IIC_SCL_output_bit(1);
    IIC_SDA_output_bit(1);
    IIC_SDA_output_bit(0);

    // IIC_output_8_bit(addr);

    for (int i = 0; i < len; i++) {
        //p();
        IIC_output_8_bit(data[i]);
    }

    // stop signal
    IIC_SCL_output_bit(1);
    IIC_SDA_output_bit(0);
    IIC_SDA_output_bit(1);
}
